<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
//    function Animal(name,age){ // 构造函数
//        this.name = name;
//        this.age = age;
//    }
//    Animal.prototype.run = function () {
//        console.log(this.name+'会跑');
//    }


//    let dog = new Animal('二哈',5);
// //    dog.run = function () {
// //      console.log(this.name+'会跑');
// //    }
//    let cat = new Animal('布袋猫',3);
// //    cat.run = function () {
// //      console.log(this.name+'会跑');
// //    }
//    let pig = new Animal('佩奇',3);
// //    pig.run = function () {
// //      console.log(this.name+'会跑');
// //    }


//    // 构造函数中 Prototype => __proto__
//    console.log(Animal.prototype  === dog.__proto__);
//    console.log(Animal.prototype  === cat.__proto__);
//    console.log(Animal.prototype  === pig.__proto__);




//    let obj = {
//      name: '张三'
//    }

//    console.log(typeof(obj.__proto__));
//    console.log(dog.__proto__);
// 每一个对象都有原型 __proto__ 原型也是一个对象 原型也有原型 __proto__



// 通常使用原型来，存放，一些，公用的属性或者方法。



// let arr = [];
// arr.push(1);
// console.log(arr);

// console.log(Array.prototype);


// let arr = new Array();
// arr.add();  这里arr是没有 add 这个方法的

// Array.prototype.add = function(){
//    let num = 0;
//    for(let i=0,item;item=this[i++];){
//      num+=item;
//    }
//    return num;
// }

// let arr = [1,2,3,4,5,6];
// console.log(arr.add());


// let arr2 = [100,200,300,400,500];
// console.log(arr2.add());




// 原型链
function Animal(name,age){ // 构造函数
       this.name = name;
       this.age = age;
   }
   Animal.prototype.run = function () {
       console.log(this.name+'会跑');
   }


let dog = new Animal('二哈',5);
console.log(dog);
dog.run();

// 首先去 dog 属性里面找 有没没有 run -> 去原型里面找 run 正常调用

console.log(dog.toString());

// 首先去 dog 属性里面找 有没没有 toString -> 去原型里面找 toString -> 去原型的原型里面找 toString

// 向上面的这样的一个链式的解构，我们称为原理链
dog.doin();

</script>